package com.nxg.pm04.util;

import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import static android.content.ContentValues.TAG;

public class Http {

    /*
    Handler的子类对象一般是在主线程中进行创建，以便在两个线程中都能访问。
    我们创建了Handler类的子类MyHandler，并重写了handlerMessage方法，这个方法是当使用接收处理发送的消息的。
    然后我们创建了一个子线程，在子线程中我们使用MyHandler的对象调用sendEmptyMessage方法发送了一个空的Message。
    然后我们就能在主线程中接收到这个数据。
     */
    //Handler导入的是os   import android.os.Handler;
    public static void get(final String urlStr, final Handler handler,final int what){
        //创建多线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
//                    Log.d(TAG, "run: "+urlStr);
                    //1、创建URL
                    URL url = new URL(urlStr);
                    //2、打开连接
                    HttpURLConnection huc = (HttpURLConnection) url.openConnection();
                    //2.1设置get方法
                    huc.setRequestMethod("GET");
                    //2.2设置连接时间5000ms
                    huc.setConnectTimeout(5000);
                    //2.3 连接
                    huc.connect();
                    //3、获得响应码
                    int responseCode = huc.getResponseCode();
                    //判断响应码 是否成功，200 成功，404未找到
                    if(responseCode == huc.HTTP_OK){//获取到的响应码==200 表示成功
                        //3.1   输入流
                        InputStream inputStream = huc.getInputStream();
                        //对输入流进行判断
                        String result = isString(inputStream);
                        //关闭输入流
                        inputStream.close();
                        if(handler!=null){
                            //注意导入的是os包 import android.os.Message;
                            //创建消息
                            Message msg = new Message();
                            //设置message中what属性 ，行为what或者一串动作Runnable, 每一个消息在加入消息队列时,都有明确的目标Handler
                            msg.what = what;
                            //控制台 打印日志
                            Log.d(TAG, "run: "+result);
                            //设置message中obj属性
                            msg.obj = result;
                            Log.d(TAG, "run: "+msg.obj);
                            //以Handler的sendMessage方法为例，当发送一个消息后，会将此消息加入消息队列MessageQueue中。
                            handler.sendMessage(msg);
                        }
                    }

                }catch (Exception e){
                    e.printStackTrace();
                    e.getMessage();
                }
            }
        }).start();//启动多线程
    }
    // ?????  处理输入流
    private static String isString(InputStream inputStream) {

        //1  创建 StringBuffer 线程不安全
        StringBuffer stringBuffer = new StringBuffer();
        try{
            // 1、1 创建一个使用默认字符集的InputStreamReader
            // InputStream in:字节输入流，用来读取文件中保存的字节
            //指定的编码表名称，不区分大小写，可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
            //1.2  创建字符数组
            char[] chars = new char[4096];
            //2、使用InputStreamReader对象中的方法read读取文件
            //int read() 读取单个字符并返回
            //int read(char[] cbuf)一次读取多个字符，经字符读入数组中
            int len;
            while((len=inputStreamReader.read(chars))!=-1){
                stringBuffer.append(new String(chars,0,len));
            }
            //??????遍历input
            //什么遍历？没用过此类方法
        /*for (int n;(n=inputStreamReader.read(b))!=-1;) {
            stringBuffer.append(b,0,n);
        }*/
        //3、释放资源
        inputStreamReader.close();

        }catch (Exception e){
            e.printStackTrace();
        }
        //返回stringBuffer
        return stringBuffer.toString();
    }
}
